package LandlordsGame.LandlordsGame002;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;

/**
 * ClassName:PokerGame
 * Package:LandlordsGame.LandlordsGame002
 * Description:
 *
 * @Author:ZhangXin
 * @Create2023/2/22-21:55
 * @Version:v1.0
 */
public class PokerGame {
    /*利用序号进行排序
     * 1.如果原始数据的规律非常复杂,我们可以先手动排序让每一个数据跟唯一的序号产生对应关系
     * 2.序号就是数字,规律非常简单,后续的所有操作我们以序号为准
     * 3.当真正需要操作原始数据的时候,在通过序号找到原始数据即可
     * */
    //此时我们只要把牌和序号产生对应关系就可以,不需要按照序号进行排序,所以只要HashMap就可以了
    static HashMap<Integer, String> hm = new HashMap<>();
    static ArrayList<Integer> list = new ArrayList<>();

    /*
        {1=♠3, 2=♠4, 3=♠5, 4=♠6, 5=♠7, 6=♠8, 7=♠9, 8=♠10, 9=♠J, 10=♠Q, 11=♠K, 12=♠A, 13=♠2,
         14=♦3, 15=♦4, 16=♦5, 17=♦6, 18=♦7, 19=♦8, 20=♦9, 21=♦10, 22=♦J, 23=♦Q, 24=♦K, 25=♦A, 26=♦2,
         27=♥3, 28=♥4, 29=♥5, 30=♥6, 31=♥7, 32=♥8, 33=♥9, 34=♥10, 35=♥J, 36=♥Q, 37=♥K, 38=♥A, 39=♥2,
         40=♣3, 41=♣4, 42=♣5, 43=♣6, 44=♣7, 45=♣8, 46=♣9, 47=♣10, 48=♣J, 49=♣Q, 50=♣K, 51=♣A, 52=♣2,
         53=小王, 54=大王}

         玩家1：  1   4   5    14
                ♠3  ♠4  ♠7   ♦3

         {1=♠3, 2=♦3, 3=♥3, 4=♣3, 5=♠4, 6=♦4, 7=♥4, 8=♣4, 9=♠5, 10=♦5, 11=♥5, 12=♣5, 13=♠6, 14=♦6, 15=♥6, 16=♣6,
          17=♠7, 18=♦7, 19=♥7, 20=♣7, 21=♠8, 22=♦8, 23=♥8, 24=♣8, 25=♠9, 26=♦9, 27=♥9, 28=♣9, 29=♠10, 30=♦10, 31=♥10, 32=♣10,
          33=♠J, 34=♦J, 35=♥J, 36=♣J, 37=♠Q, 38=♦Q, 39=♥Q, 40=♣Q, 41=♠K, 42=♦K, 43=♥K, 44=♣K, 45=♠A, 46=♦A, 47=♥A, 48=♣A,
          49=♠2, 50=♦2, 51=♥2, 52=♣2, 53=小王, 54=大王}

          玩家1：  1   2   5   14
                 ♠3  ♦3  ♠4  ♦6
    */
    static {
        //准备牌
        /* ♠ ♦ ♥ ♣
         * 3 4 5 6 7 8 9 10 J Q K A 2*/
        String[] color = {"♠", "♦", "♥", "♣"};
        String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
        //牌的序号
        int serialNumber = 1;
        //细节
        for (String n : number) {
            //n 依次表示每一个数字
            for (String c : color) {
                //c 依次表示每一种花色
                hm.put(serialNumber, c + n);
                list.add(serialNumber);
                serialNumber++;
            }
        }
        hm.put(serialNumber, "小王");
        list.add(serialNumber);
        serialNumber++;
        hm.put(serialNumber, "大王");
        list.add(serialNumber);
//        System.out.println(list);
    }

    public PokerGame() {
        //洗牌
        Collections.shuffle(list);
        //发牌
        //TreeSet自动按照默认排序从小到大
        TreeSet<Integer> lord = new TreeSet<>();
        TreeSet<Integer> player1 = new TreeSet<>();
        TreeSet<Integer> player2 = new TreeSet<>();
        TreeSet<Integer> player3 = new TreeSet<>();

        for (int i = 0; i < list.size(); i++) {
            //i依次表示集合中的每一个索引
            //list.get(i)元素：牌的序号
            int serialNumber = list.get(i);
            if (i <= 2) {
                lord.add(serialNumber);
                continue;
            }
            if (i % 3 == 0) {
                player1.add(serialNumber);
            } else if (i % 3 == 1) {
                player2.add(serialNumber);
            } else {
                player3.add(serialNumber);
            }
        }

        //看牌(拿着序号去Map集合中把对应的牌找出来)
        lookPoker("底牌", lord);
        lookPoker("鑫哥", player1);
        lookPoker("永哥", player2);
        lookPoker("杰哥", player3);

    }

    public void lookPoker(String name, TreeSet<Integer> ts) {
        System.out.print(name + ": ");
        //遍历TreeSet集合得到每一个序号,再拿着序号到Map集合中去找到真正的牌
        for (int serialNumber : ts) {
            String poker = hm.get(serialNumber);
            System.out.print(poker + " ");
        }
        System.out.println();
    }
}
